package com.udima.reglocation;

import java.util.Collection;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.udima.reglocation.entities.UserSession;
import com.udima.reglocation.helpers.JSONHelper;
import com.udima.reglocation.util.AsyncTaskCompleteListener;
import com.udima.reglocation.util.HttpAsyncTask;
import com.udima.reglocation.util.LogHelper;
import com.udima.reglocation.util.PreferencesHandler;
import com.udima.reglocation.util.UserSessionHandler;

public class ChangePasswordActivity extends Activity implements AsyncTaskCompleteListener {

	private Activity activity = this;

	private EditText inputOldPassword;
	private EditText inputNewPassword1;
	private EditText inputNewPassword2;

	private Button btnStoreData;
	private Button btnCancel;

	private TextView resultMsg;

	/**
	 * En la creación de la clase se instancian los objetos del formulario y se
	 * crean las funciones de escucha para los botones
	 */
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.change_password_activity);

		inputOldPassword = (EditText) findViewById(R.id.inputOldPassword);
		inputNewPassword1 = (EditText) findViewById(R.id.inputNewPassword1);
		inputNewPassword2 = (EditText) findViewById(R.id.inputNewPassword2);

		resultMsg = (TextView) findViewById(R.id.resultMsg);

		// Listener del boton grabar
		btnStoreData = (Button) findViewById(R.id.btnUserStoreData);
		btnStoreData.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				changePassword(view);
			}
		});

		// Listener del boton cancelar
		btnCancel = (Button) findViewById(R.id.btnUserCancelEdit);
		btnCancel.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				Intent itemintent = new Intent(ChangePasswordActivity.this, TrackMenuActivity.class);
				ChangePasswordActivity.this.startActivity(itemintent);
			}
		});

	}

	@Override
	public void onTaskComplete(String result) {

	}

	/**
	 * 
	 */
	private void changePassword(View view) {

		UserSessionHandler ush = new UserSessionHandler(getApplicationContext());
		UserSession session = ush.retrieveUserSession();
		if (session == null) {
			// No hay sesión. Se redirige al usuario a la ventana de login
			Intent i = new Intent(getBaseContext(), LoginActivity.class);
			startActivity(i);
		} else {

			PreferencesHandler ph = new PreferencesHandler(getApplicationContext());
			String appBaseUrl = ph.retrieveAppBaseUrl();

			JSONObject jsonReq = new JSONObject();
			JSONObject jsonUserSession = new JSONObject();
			JSONObject jsonUser = new JSONObject();
			try {
				jsonUserSession.put("userId", session.getUserId());
				jsonUserSession.put("sessionToken", session.getSessionToken());
				jsonReq.put("userSession", jsonUserSession);

				jsonUser.put("id", session.getUserId());

				// passwords recogidas de la pantalla
				jsonUser.put("password", inputOldPassword.getText().toString());
				jsonUser.put("newPassword", inputNewPassword1.getText().toString());
				jsonUser.put("newPasswordRepeated", inputNewPassword2.getText().toString());

				jsonReq.put("user", jsonUser);

			} catch (JSONException e) {
				Toast.makeText(getBaseContext(), "Error grave!! Revise el log de la aplicación", Toast.LENGTH_LONG).show();
				LogHelper.logError("Error parsing json result", e);
			}

			// Definición del callback particular para el cambio de contraseña
			final AsyncTaskCompleteListener callback = new AsyncTaskCompleteListener() {

				@Override
				public void onTaskComplete(String result) {

					if (HttpAsyncTask.CONNECTIONERROR.equals(result)) {
						Toast.makeText(getBaseContext(), "Error conectando con el servidor", Toast.LENGTH_LONG).show();
					} else {
						// Primero se transforma el resultado a un objeto Json
						try {
							JSONObject json = new JSONObject(result);

							if (json.getString("responseSuccessful") == "true") {
								Toast.makeText(getBaseContext(), "Contraseña cambiada correctamente", Toast.LENGTH_LONG).show();
								Intent itemintent = new Intent(ChangePasswordActivity.this, TrackMenuActivity.class);
								ChangePasswordActivity.this.startActivity(itemintent);
							} else {
								processResponseErrors(json.getJSONArray("responseErrors"));
							}
						} catch (JSONException e) {
							Toast.makeText(getBaseContext(), "Error grave!! Revise el log de la aplicación", Toast.LENGTH_LONG).show();
							LogHelper.logError("Error parsing json result", e);
						}
					}
				}
			};

			// Ejecución de la consulta al servicio rest de cambio de contraseña
			new HttpAsyncTask(activity) {
				@Override
				protected void onPostExecute(String result) {
					super.onPostExecute(result);
					callback.onTaskComplete(result);
				}
			}.execute(appBaseUrl + "/rest/users/changepwd", jsonReq.toString());

		}
	}

	/**
	 * 
	 * @param errors
	 * @throws JSONException
	 */
	private void processResponseErrors(JSONArray errors) throws JSONException {

		JSONHelper jHelper = new JSONHelper();
		Collection<String> errs = jHelper.JSONArrayToStringCollection(errors);

		for (String err : errs) {

			if (err.contains("NEWPASSWORD_BLANK")) {
				resultMsg.setText("Introduzca la contraseña");
			} else if (err.contains("NEWPASSWORD_PERSONALDATAINCLUDED")) {
				resultMsg.setText("La contraseña incluye datos personales que la hacen poco segura");
			} else if (err.contains("NEWPASSWORD_TOOSHORT")) {
				resultMsg.setText("La contraseña es demasiado corta. Debe tener al menos 8 caracteres");
			} else if (err.contains("NEWPASSWORD_CARACTERSNOTALLOWED")) {
				resultMsg.setText("La contraseña contiene caracteres no permitidos");
			} else if (err.contains("NEWPASSWORD_CARACTERSNOTMIXED")) {
				resultMsg
						.setText("La contraseña debe contener al menos tres de los tipos de caracteres siguientes: letras minúsculas, letras mayúsculas, dígitos y caracteres speciales (coma, punto, guión, subrayado, almohadilla)");
			} else if (err.contains("NEWPASSWORDS_UNMATCHED")) {
				resultMsg.setText("Las contraseñas no coinciden");
			}
		}

	}

}